
#include <malloc.h>

#include "ordenamiento-inicial.h"
#include "../varios/log.h"
#include "../varios/mensajes.h"
#include "../varios/mpi-utiles.h"
#include "../varios/compresion.h"
#include "../../compartido/vectores.h"
#include "../../compartido/mergesort.h"


/*
 * Implementación de función de cabecera
 */
struct VECTOR *obtenerVectorInicial(long long tamVectorInicial) {

    LOGGER("Necesitamos obtener un vector de tamaño %l", tamVectorInicial);
    
    // En este vector guardaremos el vector recibido
    struct VECTOR *vectorInicial = crearVector(tamVectorInicial);
    long long cantElementRecib = 0; // Indica cuantos elementos del vector recibimos
    
    // Iteramos hasta que recibamos todos los elementos
    while(cantElementRecib<tamVectorInicial) {
        
        LOGGER("Esperamos y leemos elementos del vector inicial");
        
        // Esperamos que lleguen datos y los leemos
        struct DATOS_RECIBIDOS datosBloque = recibirDatos(0, MSG_VECTOR_INICIAL);
        
        // Ahora descomprimimos las datos
        struct DATOS_DESCOMPRIMIDOS datosDesc = descomprimir(datosBloque.datos);
        free(datosBloque.datos);
        
        // Obtenemos el vector inicial
        int *datos = (int *) datosDesc.datos;
        long long longDatos = datosDesc.longitud / sizeof(int);
        
        LOGGER("Longitud comprimida: %l, longitud descomprimida: %l", datosBloque.tamanio, datosDesc.longitud);
        
        // Escribimos los datos en el vector que ordenaremos luego
        long long p;
        for (p=0; p<longDatos; p++) {
            escribirValor(vectorInicial, datos[p], cantElementRecib+p);
        }
        
        // Seteamos el proximo desplazamiento
        cantElementRecib += longDatos;
        
        LOGGER("Recibimos al momento %l de %l", cantElementRecib, tamVectorInicial);
        
    }
    
    LOGGER("Vector inicial recibido %s", imprimirVector(vectorInicial));
    
    // Ahora ordenamos el vector recibido
    LOGGER("Ordenamos el vector recibido");
    mergesortEnDisco(vectorInicial);
    
    return vectorInicial;
    
}